# -!- coding: utf-8 -!-
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#作者：cacho_37967865
#博客：https://blog.csdn.net/sinat_37967865
#文件：PILModel.py
#日期：2019-05-31
#备注：通过PIL库处理图片（png、jpg、gif等）    pip install pillow  
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

import numpy as np
from PIL import Image, ImageDraw, ImageFilter,ImageFont,ImageEnhance
import os


print("当前目录地址为："+os.getcwd())

def get_file():
    files = os.listdir("F:\PythonProject\machineLearn\\test")
    image_list = [f for f in files if f.endswith((".png"))]
    for image in image_list:
        compress_image(image)


# 压缩
def compress_image(infile, outfile='', mb=10.0, step=10, quality=10):
    """不改变图片尺寸压缩到指定大小,无法压缩png格式图片
    :param infile: 压缩源文件
    :param outfile: 压缩文件保存地址
    :param mb: 压缩目标，KB
    :param step: 每次调整的压缩比率
    :param quality: 初始压缩比率
    :return: 压缩文件地址，压缩文件大小
    """
    outfile = infile[:-4]
    image_type = infile[-3:]
    image = Image.open(infile)
    if image_type == 'png':
        image.convert('RGB').save(outfile + '.jpg', quality=quality)
    else:
        image.save(outfile + '.jpg', quality=quality)


def analyse_image(file):
    im = Image.open(file)
    print('得到的是一个对象:',im)
    file_name = file[0:-4]
    if file[2:5] == 'jpg':
        info = im.info
        mode = im.mode                    # 图片类型
        format = im.format
        print("jpg格式:RGB",info, '图像的模式:'+mode,'图像类别:'+format)
        #im.save(file_name + '.png')              # jpg直接转换为png,但大小无法改变
    elif file[2:5] == 'gif':
        info = im.info
        mode = im.mode
        format = im.format
        print("gif格式:P",info, mode,format)
    elif file[2:5] == 'png':
        info = im.info
        mode = im.mode                    # 图片类型
        format = im.format
        print("png格式:RGBA",info, mode,format)
        #pil_convert = im.convert('RGB')           # 将其转换成jpg格式
        #pil_convert.save(file_name + '.jpg')      # png无法直接保存为jpg
    datas = list(im.getdata())
    #print(type(datas),datas)
    for data in datas:
        print(data)

    print('返回包括每个通道名称的元组:',im.getbands())
    print('计算图像非零区域的包围盒:',im.getbbox())
    print('返回了R/G/B三个通道的最小和最大值的2元组:',im.getextrema())
    #size = im.size                    # 获取图像水平和垂直方向上的像素数
    #print(size)


# 图片类型转换 # PIL的九种不同模式：1，L，P，RGB，RGBA，CMYK，YCbCr,I，F
def convert_image(file):
    im = Image.open(file)
    #pil_convert = im.convert('L')    # 将其转换成灰度图像 8位像素，黑白
    #pil_convert = im.convert('1')    # 将其转换成灰度图像 1位像素，黑和白，存成8位的像素
    #pil_convert = im.convert('P')     # 将其转换为8位像素，使用调色板映射到任何其他模式,只能存储为png格式
    #pil_convert = im.convert('RGB')   # 将其转换为3× 8位像素，真彩
    pil_convert = im.convert('RGBA')   # 将其转换为4×8位像素，真彩+透明通道,只能存储为png格式
    #pil_convert = im.convert('CMYK')   # 将其转换为4×8位像素，颜色隔离,只能存储为jpg格式
    #pil_convert = im.convert('YCbCr')  # 将其转换为3×8位像素，彩色视频格式
    #pil_convert = im.convert('I')       # 将其转换为32位整型像素,只能存储为png格式
    #pil_convert = im.convert('F')        # 将其转换为32位浮点型像素
    #pil_convert.save('L' + '.jpg')
    pil_convert.show()


# 得到透明图片
def get_clearImage(file):
    img = Image.open(file)
    data = img.getdata()
    #print(list(data))
    img = img.convert("RGBA")
    datas = img.getdata()
    #print(list(datas))
    newData = list()
    for item in datas:
        if item[0] < 50 and item[1] < 50 and item[2] < 50:
            newData.append((255, 255, 255, 0))
        else:
            newData.append(item)

    img.putdata(newData)
    img.save("alpha.png", "PNG")


# 获取图片某个图片的像素值
def getPixel(file):
    img = Image.open(file)
    L = img.getpixel((1, 1))
    print('像素值：',type(L),L)


# 调整图片某个位置的像素值
def put_pixel(file):
    img = Image.open(file)
    img.putpixel((4,4),(0,0,255))
    img.putpixel((4,5),(0,0,255))
    img.putpixel((4,6),(0,0,255))
    img.putpixel((4,7),(0,0,255))
    img.show()


# 附上文字
def putWords(file):
    str = "往后余生,风雪是你,平淡是你,清贫也是你\n荣华是你,心底温柔是你,目光所致,也是你"
    word_css = "C:\Windows\Fonts\STXINGKA.TTF"  # 字体文件
    word_size = 20             # 默认为10
    word_site = (10,10)       # 左上角开始的横纵坐标
    word_rgb = (255, 255, 0)       # 字体颜色
    font = ImageFont.truetype(word_css, word_size)
    img = Image.open(file)
    draw = ImageDraw.Draw(img)
    draw.text(word_site, str, word_rgb, font=font)
    img.save('font.jpg')
    del draw                    # 删除画笔
    img.close()                 # 关闭图片


# 分离通道+合并通道
def split_image(file):
    img = Image.open(file)
    r, g, b = img.split()
    print(r,g,b)
    img_sum = Image.merge("RGB", (r, b, g))
    img_sum.show()


# 合并图片
def merge_image(background,file):
    img = Image.open(background)
    out = Image.open(file)
    img.paste(out)
    img.save('F:\\out.jpg')


# 创建背景图 Image.new(mode, size, color=0)  缺省默认为黑色
def new_image():
    new_image = Image.new("RGB", (359, 650), "#FF0000")      # 16进制
    rgb_image = Image.new("RGB", (1920, 650), (30, 30, 30))   # RGB
    #new_image.show()
    rgb_image.save('F:\\background1.png')


# 裁剪+复制+调整尺寸+获取缩略图
def crop_image(file):
    img = Image.open(file)
    box = (0, 0, 2197, 2197)                # 四元组的坐标依次是（左，上，右，下）
    img.crop(box).save("F:\\alibaba\产品图片\\1.jpg")  # 从一幅图像中裁剪指定区域
    #pil_copy = img.copy()                      # 复制图像
    #pil_out = img.resize((128, 128))           # 调整尺寸
    #pil_thumbnail= img.thumbnail((100, 100))   # 会计算一个合适的缩略图尺寸
    #img.show()
    #img.save("F:\PythonProject\machinelearn\File\\t2.png", "PNG")


# 返回当前图像的翻转或者旋转的拷贝
def transpose_image(file):
    img = Image.open(file)
    img.rotate(90)                 # 逆时针旋转 45 度角。
    #img.transpose(Image.FLIP_LEFT_RIGHT)  # 左右对换。
    #img.transpose(Image.FLIP_TOP_BOTTOM)  # 上下对换。
    #img.transpose(Image.ROTATE_90)  # 旋转 90 度角。
    #img.transpose(Image.ROTATE_180)  # 旋转 180 度角。
    #img.transpose(Image.ROTATE_270)  # 旋转 270 度角。
    img.save('r.jpg')


# 图片过滤处理
def filter_image(file):
    img = Image.open(file)
    bluF = img.filter(ImageFilter.BLUR)            #均值滤波-模糊
    conF = img.filter(ImageFilter.CONTOUR)         #找轮廓
    edgeF = img.filter(ImageFilter.FIND_EDGES)     #边缘检测
    bluF.show()
    conF.show()
    edgeF.show()


# 配置图像文件加载器，使得返回一个与给定的模式和尺寸尽可能匹配的图像的版本
def draft_image(file):
    img = Image.open(file)
    print(img.size, img.mode)
    new_img = img.draft("L", (200,200))
    print(new_img.size, new_img.mode)
    new_img.show()


# 获取gif图片具体帧数
def seek_gif(file):
    img = Image.open(file)
    #img.show()          # 默认显示第一帧
    print(img.tell())         # 返回当前帧所处位置，从0开始计算
    img.seek(3)       # 查找第三帧
    #img.show()      # 显示第三帧
    print(img.tell())


# 将图片对象与图片矩阵相互转换
def change_type(file):
    im = Image.open(file)
    #图片对象转化为图片矩阵
    arr = np.array(im)
    print(arr.shape,arr.dtype)
    print('图片矩阵:',arr)
    # 矩阵再转为图像
    #new_im = Image.fromarray(arr)
    #new_im.save('1copy.png')


def image_enhance(file):
    type = 3
    im = Image.open(file)
    if type == 2:
        en = ImageEnhance.Brightness(im)    # 图片的亮度增加(调整图像的颜色均衡)
        im_en = en.enhance(1.2)             # 增强因子为0.0将产生黑色图像；为1.0将保持原始图像
    elif type == 3:
        en = ImageEnhance.Color(im)         # 图片的色度增强
        im_en = en.enhance(1.5)             # 增强因子为0.0将产生黑色图像；为1.0将保持原始图像
    elif  type == 5:
        en = ImageEnhance.Contrast(im)      # 图片的对比度增强
        im_en = en.enhance(2.0)             # 增强因子为0.0将产生黑色图像；为1.0将保持原始图像
    else:
        en = ImageEnhance.Sharpness(im)     # 图片的锐度的增强
        im_en = en.enhance(2.0)             # 增强因子为0.0将产生模糊图像；为1.0将保持原始图像，为2.0将产生锐化过的图像
    im_en.show()


# 截取图像
def cut_image(file):
    im = Image.open(file)
    he = 540
    sh = 570
    he_s = 660
    box = (he, sh, he_s, 660)       # 四元组的坐标依次是（左，上，右，下） 120  30
    new_img = im.crop(box)
    w, h = new_img.size
    for i in range(w):
        for j in range(h):
            L = new_img.getpixel((i, j))
            if i<20:
                T = im.getpixel((540, 660))
            elif i>w-10:
                T = im.getpixel((540, 600))
            else:
                T = im.getpixel((540, 600))
            print(i,j,L)
            new_img.putpixel((i, j), T)  # 上黄 box = (20, 25, 298, 72)
    #new_img.show()
    im.paste(new_img, box)
    im.show()
    #im.save('F:\image\output\\new\\01\\' +'01_'+os.path.basename(file))

# 缩小放大
def resize_image(file,out_file):
    im = Image.open(file)
    image = im.resize((480, 1000))
    image.save(out_file,quality=100)

if __name__ == '__main__':
    #convert_image('F:\\b.jpg')
    #get_file()
    #compress_image('1.png')
    #analyse_image('1.gif')
    #analyse_image('P.png')
    #analyse_image('1.jpg')
    #change_type('1.jpg')
    #change_type('1.png')
    #get_clearImage('1.png')
    #putWords('1.jpg')
    #add_image('E:\图片\证件\\户主.jpeg','E:\图片\证件\\曾舒妍-户口.jpeg')
    #new_image()
    #filter_image('1.jpg')
    #split_image('1.jpg')
    #draft_image('1.jpg')
    #seek_gif('4.gif')
    #transpose_image('1.png')
    #getPixel('1.png')
    #put_pixel('F:\PythonProject\machineLearn\images\id.png')
    #image_enhance('F:\PythonProject\machineLearn\images\id_1.png')
    crop_image('F:\\alibaba\产品图片\\IMG_8915.jpg')
    #cut_image('F:\PythonProject\machinelearn\File\\t1.png')
    #merge_image('F:\\b1.jpg','F:\\1.png')
    #resize_image('F:\\alibaba\产品图片\\phone1.png','F:\\alibaba\产品图片\\phone2.png')